<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="org.apache.poi.hssf.util.*,org.apache.poi.hssf.usermodel.*,org.apache.poi.ss.usermodel.*,org.apache.poi.xssf.util.*,org.apache.poi.xssf.usermodel.*,java.io.*,model.vo.MrainfoVO,java.util.*, java.text.SimpleDateFormat"%> 
<%
String filename = "RA정보평가.xls";    
filename = new String(filename.getBytes("euc-kr"), "8859_1"); 
//엑셀로출력될 화일이름.. request.getParameter("filename")으로 받아서 사용하면 다른 화일이름으로도 저장이 가능합니다.

  //ObBean obBean = new ObBean();       //이건 제가사용하던 dbConnection, 한글변환 등의 method들이 있는 빈즈입니다. 이거 빼고 자신이 사용하는 dbConnection을 사용하심됩니다.
  
  //String queryStr = "sp_orderList '2002-11-01','2002-11-22','userid'  "   // queryStr 은 퀴리문으로 단순화하기 위하여 스토어드 프로시져를 사용합니다. (폼값으로 넘겨줘서사용해도 됩니다.이때는 post방식을..)

 

  int rsCnt=2;

  HSSFWorkbook wb = new HSSFWorkbook();           //workbook생성
     HSSFSheet sheet1 = wb.createSheet("new sheet");  //worksheet에 new sheet생성

     HSSFRow row = null;
     HSSFCell cell = null;

 //제목 스타일
  HSSFCellStyle style = wb.createCellStyle(); 
  //style.setFillBackgroundColor(HSSFColor.GREY_50_PERCENT.index);
  style.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
  style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);             //채움스타일을 SOLID_FOREGROUND으로 한다.
  style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  
//가운데라인
  HSSFCellStyle styleMid = wb.createCellStyle(); 
  styleMid.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  styleMid.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleMid.setBorderRight(HSSFCellStyle.BORDER_THIN);
  styleMid.setBorderTop(HSSFCellStyle.BORDER_THIN);
 
  //오른쪽
  HSSFCellStyle styleRight = wb.createCellStyle(); 
  styleRight.setBorderTop(HSSFCellStyle.BORDER_THIN);
  styleRight.setBorderRight(HSSFCellStyle.BORDER_THIN);
  
  
  //왼쪽
  HSSFCellStyle styleLeft = wb.createCellStyle(); 
  styleLeft.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleLeft.setBorderBottom(HSSFCellStyle.BORDER_THIN);

  
//내용 스타일
  HSSFCellStyle styleLContent = wb.createCellStyle(); 
  styleLContent.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
  styleLContent.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
  styleLContent.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  styleLContent.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleLContent.setBorderRight(HSSFCellStyle.BORDER_THIN);
  styleLContent.setBorderTop(HSSFCellStyle.BORDER_THIN);
  
  HSSFCellStyle styleLContent1 = wb.createCellStyle(); 
  styleLContent1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  styleLContent1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleLContent1.setBorderRight(HSSFCellStyle.BORDER_THIN);
  styleLContent1.setBorderTop(HSSFCellStyle.BORDER_THIN);
  
  HSSFCellStyle styleLContentDate = wb.createCellStyle(); 
  styleLContentDate.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
  styleLContentDate.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
  styleLContentDate.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  styleLContentDate.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleLContentDate.setBorderRight(HSSFCellStyle.BORDER_THIN);
  styleLContentDate.setBorderTop(HSSFCellStyle.BORDER_THIN);
  styleLContentDate.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));

  
  HSSFCellStyle styleLContentDate1 = wb.createCellStyle(); 
  styleLContentDate1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  styleLContentDate1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleLContentDate1.setBorderRight(HSSFCellStyle.BORDER_THIN);
  styleLContentDate1.setBorderTop(HSSFCellStyle.BORDER_THIN);
  styleLContentDate1.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
  
  HSSFCellStyle styleLContentNoData = wb.createCellStyle(); 
  styleLContentNoData.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  styleLContentNoData.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  styleLContentNoData.setBorderRight(HSSFCellStyle.BORDER_THIN);
  styleLContentNoData.setBorderTop(HSSFCellStyle.BORDER_THIN);
  styleLContentNoData.setAlignment(HSSFCellStyle.ALIGN_CENTER);
/*
  Statement stmt=  null; 
  ResultSet rs = null;

  stmt = obBean.createStatement();
  rs = stmt.executeQuery(queryStr);         // 쿼리를 실행합니다.
*/

  //컬럼명 찍는 부분  
 // ResultSetMetaData rsmd = rs.getMetaData();     //resultset의 메타데이타를 생성합니다.(컬럼명이나,필드속성등의 정보를 받아올수 있습니다.)
  //int numberOfColumns = rsmd.getColumnCount();  //컬럼수를 카운드
    int numberOfColumns= 9;  //컬럼수를 카운드
    int numberOfColumns1 = 9;  //컬럼수를 카운드
  //String[] ColumnsName=new String[numberOfColumns];  //컬럼이름을 담을 변수를 배열로 지정합니다.
  String[] ColumnsName={"정보코드", "정보명칭", "작성일자", "버전번호", "프로필작성자", "정보소유자", "연관프로세스", "지역/사이트", "정보기술서"};  //컬럼이름을 담을 변수를 배열로 지정합니다.
  String[] ColumnsName1={"기밀성", "무결성", "가용성", "C", "I", "A", "보안점수", "보안등급", "기밀등급"};  //컬럼이름을 담을 변수를 배열로 지정합니다.
 // int[] ColumnsType = new int[numberOfColumns];     //컬럼의 타잎정보(즉,String , Integer, Decimal등 자료형을 가져옵니다.
		 
		 //길이 조절
		 //sheet1.setColumnWidth((short) 0, (short)(300*15));
		 
		 
  row = sheet1.createRow((short)0);	 
 
  for(int ii=0;ii<numberOfColumns;ii++){  
	//길이 조절
		 sheet1.setColumnWidth((short) ii, (short)(300*15));
	  //  ColumnsName[ii]=rsmd.getColumnName(ii+1);  
	  //  ColumnsType[ii]=rsmd.getColumnType(ii+1);
	    cell = row.createCell((short) ii);
	   // cell.setEncoding(HSSFCell.ENCODING_UTF_16);   // 한글 출력시에는 UTF_16으로 해야함. 한글이 2byte이기때문에..(이제 필요없음)
	    cell.setCellValue(ColumnsName[ii]);  
	  //  cell.setCellValue(ColumnsName[ii]);      // xls화일의  첫줄에 db의 컬럼명을 출력한다.
	    cell.setCellStyle(style);                     //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
	    sheet1.addMergedRegion(new Region(0,(short) ii,1,(short) ii));   
	   }  
  
  
  
  
  
  
  //sheet1.addMergedRegion(new CellRangeAddress(0,1,(short)0,(short)0));
  cell = row.createCell((short)9);
  cell.setCellValue("RA정보보안요구사항");
  cell.setCellStyle(style);             
  cell = row.createCell((short)10);
  cell.setCellStyle(styleMid);             
  cell = row.createCell((short)11);
  cell.setCellStyle(styleMid);             
  sheet1.addMergedRegion(new Region(0,(short)9,0,(short)11));
  //sheet1.addMergedRegion(new CellRangeAddress(0,0,(short)1,(short)3));
  cell = row.createCell((short)12);
  cell.setCellValue("RA정보가치평가");
  cell.setCellStyle(style);       
  cell = row.createCell((short)13);
  cell.setCellStyle(styleMid);        
  cell = row.createCell((short)14);
  cell.setCellStyle(styleMid);        
  cell = row.createCell((short)15);
  cell.setCellStyle(styleMid);         
  cell = row.createCell((short)16);
  cell.setCellStyle(styleRight);       
  cell = row.createCell((short)17);
  cell.setCellStyle(styleRight);            
  //Region region = new (int 시작ROW, short 시작COL, int 종료ROW, short 종료COL);
  sheet1.addMergedRegion(new Region(0,(short)12,0,(short)17));
  //sheet1.addMergedRegion(new CellRangeAddress(0,0,(short)4,(short)9));





  
  row = sheet1.createRow((short)1);
  for(int j=0;j<numberOfColumns;j++){  
	  cell = row.createCell((short) j);
	  cell.setCellStyle(style);
  }
  
  for(int ii=0;ii<numberOfColumns1;ii++){  
 //  ColumnsName[ii]=rsmd.getColumnName(ii+1);  
 //  ColumnsType[ii]=rsmd.getColumnType(ii+1);
   cell = row.createCell((short)(ii+numberOfColumns));
  // cell.setEncoding(HSSFCell.ENCODING_UTF_16);   // 한글 출력시에는 UTF_16으로 해야함. 한글이 2byte이기때문에..(이제 필요없음)
   cell.setCellValue(ColumnsName1[ii]);  
 //  cell.setCellValue(ColumnsName[ii]);      // xls화일의  첫줄에 db의 컬럼명을 출력한다.
   cell.setCellStyle(style);                     //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
  }  
  
  
  
  
  List<MrainfoVO> list=(List<MrainfoVO>)request.getAttribute("list");
  if(list.size()!=0){//0이 아닐때
  for(int iii=0;iii<list.size();iii++){
	  MrainfoVO vo=(MrainfoVO)list.get(iii);
	  
	  
	  row = sheet1.createRow((short)(iii+2));
	  
		    for(int jj=0;jj<numberOfColumns;jj++){  
		    	 cell = row.createCell((short) jj);
		    	//길이 조절
		    	if(jj==0){
					cell.setCellValue(vo.getRainfo_id());
				}else if(jj==1){
					cell.setCellValue(vo.getRainfo_nm());
				}else if(jj==2){
					SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd"); 
					System.out.println(vo.getRainfo_date());
					Date mdate=formatter.parse(vo.getRainfo_date());
					cell.setCellValue(mdate);
				}else if(jj==3){
					cell.setCellValue(vo.getRainfo_ver());
				}else if(jj==4){
					cell.setCellValue(vo.getRainfo_writer());
				}else if(jj==5){
					cell.setCellValue(vo.getRainfo_owner());
				}else if(jj==6){
					cell.setCellValue(vo.getRainfo_proc());
				}else if(jj==7){
					cell.setCellValue(vo.getRainfo_site());
				}else if(jj==8){
					cell.setCellValue(vo.getRainfo_doc());
				}
				if(iii%2==0){
					if(jj==2){
						cell.setCellStyle(styleLContentDate1); 
					}else{
						cell.setCellStyle(styleLContent1); 
					}
					
			 	 }else if(iii%2!=0){
			 		if(jj==2){
						cell.setCellStyle(styleLContentDate); 
					}else{
						cell.setCellStyle(styleLContent); 
					}
				 }
		    }  	    
		    
		    
		    
		    
		    
	for(int iiii=0;iiii<numberOfColumns1;iiii++){
		cell = row.createCell((short) (iiii+numberOfColumns));
		if(iiii==0){
			cell.setCellValue(vo.getC_memo());
		}else if(iiii==1){
			cell.setCellValue(vo.getI_memo());
		}else if(iiii==2){
			cell.setCellValue(vo.getA_memo());
		}else if(iiii==3){
			if(vo.getAscu_level()!=null)
			cell.setCellValue(vo.getC_score());
		}else if(iiii==4){
			if(vo.getAscu_level()!=null)
			cell.setCellValue(vo.getI_score());
		}else if(iiii==5){
			if(vo.getAscu_level()!=null)
			cell.setCellValue(vo.getA_score());
		}else if(iiii==6){
			if(vo.getAscu_level()!=null)
			cell.setCellValue(vo.getT_score());
		}else if(iiii==7){
			cell.setCellValue(vo.getAscu_level());
		}else if(iiii==8){
			cell.setCellValue(vo.getAsc_level());
		}
		if(iii%2==0){
			cell.setCellStyle(styleLContent1); 
	 	 }else if(iii%2!=0){
			  cell.setCellStyle(styleLContent); 
		 }
	}
		    
	  
	  
	  
	  
	
	
	}
  
	  
	  
	  
  }else{//0일때는 데이터 없다는 글을 찍어줌
	  row = sheet1.createRow((short)2);
	  cell = row.createCell((short)0);
	  cell.setCellValue("-데이터가 없습니다-");
	  cell.setCellStyle(styleLContentNoData);       
	  for(int iiiii=1;iiiii<(numberOfColumns+numberOfColumns1);iiiii++){  
		    cell = row.createCell((short)(iiiii));
		    cell.setCellStyle(styleLContentNoData);                     //스타일적용(글씨 색,배경색, 정렬, 크기등을 넣을수 있다.)
		   }  
	 sheet1.addMergedRegion(new Region(2,(short)0,2,(short) (numberOfColumns+numberOfColumns1-1)));
	  //sheet1.addMergedRegion(new CellRangeAddress(2,2,(short)0,(short)10));
  }

  /*
    while(rs.next()){      //DB의 내용출력부분
     row = sheet1.createRow((short)rsCnt);
     for(int i=1;i<=numberOfColumns;i++){
      cell = row.createCell((short) i);
      cell.setEncoding( HSSFCell.ENCODING_UTF_16 );

    switch(ColumnsType[i-1]){
      case 93:
       cell.setCellValue(rs.getString(i));
       break;
      case 4:
       cell.setCellValue(rs.getInt(i));
       break;
      case 3:
       cell.setCellValue(rs.getFloat(i));
       break;

      default:
       cell.setCellValue(rs.getString(i));
       break;
    }

// case 93 , case 4... 등은 API의 java.sql.TYPE를 찾아보시면 나와있습니다.
  }
   
   rsCnt++;
  }
*/

  //파일저장("_temp/"에 임시 저장을 합니다. 그리고 아래부분에서 다운받는 즉시 삭제합니다. 중복은 거의 없을 겁니다. 이부분에서 고생을 많이 했는데 더 좋은 방법있는분은 알려주세요.)
  FileOutputStream fileOut = null;
String context=getServletContext().getRealPath("/");
  try{
   fileOut = new FileOutputStream(context+filename);
  }catch(FileNotFoundException e){
   System.out.println(e);
  }
  try{
   wb.write(fileOut);
   fileOut.close();
  }catch(IOException e){
   System.out.println(e);
  }
 


%>


<% 
 //여기부터 화일 다운로드 창이 자동으로 뜨게 하기 위한 코딩(임시화일을 스트림으로 저장)
 File file = new File (context+filename);  //해당 경로의 파일 객체를 만든다. 
 byte[] bytestream = new byte[(int)file.length()];  //파일 스트림을 저장하기 위한 바이트 배열 생성. 
 FileInputStream filestream = new FileInputStream(file);   //파일 객체를 스트림으로 불러온다. 
 int i = 0, j = 0;   //파일 스트림을 바이트 배열에 넣는다. 
 while((i = filestream.read()) != -1) { 
  bytestream[j] = (byte)i; 
  j++; 
 }
 filestream.close();   //FileInputStream을 닫아줘야 file이 삭제된다.

 try{
  boolean  success = file.delete(); //화일을 생성과 동시에 byte[]배열에 입력후 화일은 삭제
  if(!success) System.out.println("<script>alert('not success')</script>"); 
 } catch(IllegalArgumentException e){ 
  System.err.println(e.getMessage()); 
 } 
	response.setContentType("application/vnd.ms-excel;charset=utf-8");
// response.setContentType("application/x-msdownload;charset=EUC-KR");  //응답 헤더의 Content-Type을 세팅한다.  
 response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\";"); 
 response.setHeader("Content-Transfer-Encoding", "binary"); 
 
 out.clear();
 out = pageContext.pushBody();


 
 OutputStream outStream = response.getOutputStream();  // 응답 스트림 객체를 생성한다. 
 outStream.write(bytestream);  // 응답 스트림에 파일 바이트 배열을 쓴다. 
 outStream.close();

%>
